.TITLE DRSRF .IDENT /05.00/ ; ; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved ; ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY BE USED ; OR COPIED ONLY IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; ORIGINALLY PART OF DRMAP ; ; MOVED TO THIS MODULE BY B. S. MCCARTHY 28-NOV-83 TO ALLOW DRMAP ; TO BE INCLUDED IN THE THIRD DIRECTIVE COMMON. SEE NOTE IN DRMAP ; REGARDING PLACEMENT OF DRSRF/DRRRF ; .IF DF P$$LAS .MCALL HDRDF$,PCBDF$,TCBDF$,WDBDF$ HDRDF$ ;DEFINE HEADER AND WINDOW BLOCK OFFSETS PCBDF$ ;DEFINE PCB AND ATTACHMENT DESCR OFFSETS TCBDF$ ;DEFINE TCB OFFSETS WDBDF$ ;DEFINE WINDOW DEFINITION BLOCK OFFSETS ;+ ; **-$DRSRF-SEND BY REFERENCE ; ; THIS DIRECTIVE INSTRUCTS THE SYSTEM TO CREATE A SPECIALLY FORMATTED ; PACKET INCLUDING A REFERENCE TO A SPECIFIED REGION WITH ADDITIONAL ; OPTIONAL INFORMATION SUPPLIED BY THE ISSUING TASK. THE SENDER TASK ; MUST ITSELF HAVE THE ACCESS SPECIFIED IN THE REFERENCE. THE REFERENCED ; REGION IS ATTACHED TO THE RECEIVING TASK. ; ; DPB FORMAT: ; ; WD. 00 -- DIC(69.),DPB SIZE(5.) ; WD. 01 -- FIRST HALF OF RECEIVER TASK NAME ; WD. 02 -- SECOND HALF OF RECEIVER TASK NAME ; WD. 03 -- OPTIONAL EVENT FLAG TO SET WHEN RECEIVE OCCURS ; WD. 04 -- ADDRESS OF WINDOW DEFINITION BLOCK ; ; INPUTS: ; ; R0=ADDRESS OF THE TCB OF THE RECEIVER TASK ; R1=ADDRESS OF THE TASK STATUS WORD OF THE RECEIVER TASK ; R2=ADDRESS OF THE TASK STATUS WORD OF THE CURRENT TASK. ; R3=ADDRESS OF THE EFN NUMBER IN THE DPB. ; R4=ADDRESS OF THE HEADER OF THE CURRENT TASK. ; R5=ADDRESS OF THE TCB OF THE CURRENT TASK. ; ; INPUT FIELDS IN THE WINDOW DEFINITION BLOCK ARE: ; W.NRID=ID OF REGION TO BE SENT BY REFERENCE. ; W.NOFF=OFFSET WORD PASSED WITHOUT CHECKING. ; W.NLEN=LENGTH WORD PASSED WITHOUT CHECKING. ; W.NSTS=ALLOWED ACCESS (DEFAULTS TO ACCESS OF SENDER TASK). ; WS.RED=1 IF READ ACCESS IS TO BE ALLOWED. ; WS.WRT=1 IF WRITE ACCESS IS TO BE ALLOWED. ; WS.EXT=1 IF EXTEND ACCESS IS TO BE ALLOWED. ; WS.DEL=1 IF DELETE ACCESS IS TO BE ALLOWED. ; W.NSRB=OPTIONAL ADDRESS OF 8 WORD BUFFER OF ADDITIONAL INFO. ; ; OUTPUTS: (DIRECTIVE STATUS AND PS RETURNED TO TASK) ; ; C=0 IF DIRECTIVE IS SUCCESSFULLY COMPLETED. ; DIRECTIVE STATUS OF +1 IS RETURNED. ; C=1 IF DIRECTIVE IS REJECTED. ; DIRECTIVE STATUS OF 'D.RS1' IS RETURNED IF A SEND PACKET ; OR ATTACHMENT DESCRIPTOR COULD NOT BE ALLOCATED. ; DIRECTIVE STATUS OF 'D.RS2' IS RETURNED IF AN ATTEMPT IS ; MADE TO SEND TO AN ACP TASK. ; DIRECTIVE STATUS OF 'D.RS6' IS RETURNED IF THE SPECIFIED ; HAS HAD A PARITY ERROR. ; DIRECTIVE STATUS OF 'D.RS16' IS RETURNED IF THE DESIRED ; ACCESS TO THE REGION IS DENIED. ; DIRECTIVE STATUS OF 'D.RS86' IS RETURNED IF AN INVALID ; REGION ID WAS SPECIFIED. ; DIRECTIVE STATUS OF 'D.RS97' IS RETURNED IF AN INVALID EFN ; NUMBER IS SPECIFIED. ; DIRECTIVE STATUS OF 'D.RS98' IS RETURNED IF THE ADDRESS ; CHECK OF THE WINDOW DEF BLOCK OR SEND BUFFER FAILS. ; ; OUTPUT FIELDS IN THE WINDOW DEFINITION BLOCK ARE: ; NONE. ; ; THE FORMAT OF THE SEND BY REFERENCE PACKET IS: ; WD. 00 -- RECEIVE QUEUE THREAD. ; WD. 01 -- TCB ADDRESS IF EFN SPECIFIED / 0 IF NOT. ; WD. 02 -- EFN MASK / FIRST WORD OF SENDER TASK NAME. ; WD. 03 -- EFN ADDRESS / SECOND WORD OF SENDER TASK NAME. ; WD. 04 -- REGION ID (ATTACHMENT DESCRIPTOR ADDRESS). ; WD. 05 -- OFFSET IN REGION WORD. ; WD. 06 -- LENGTH OF MAP WORD. ; WD. 07 -- STATUS WORD. ; WD. 08 THRU WD. 017 -- CONTENTS OF SEND BUFFER. ;- $DRSRF::BIT #T3.ACP!T3.NSD,T.ST3(R0) ;SENDS LEGAL TO RECEIVER? BNE 3$ ;IF NE NO MOV R0,-(SP) ;SAVE RECEIVER TASK TCB ADDRESS CALL $CEFNG ;CONVERT EFN AND LOCK IF GROUP GLOBAL BCS 4$ ;IF CS NO EFN WAS SPECIFIED INCB T.SRCT(R5) ;INCREMENT NUMBER OF INCOMPLETE SREFS MOV R5,-(SP) ;SAVE SENDER TCB ADDRESS MOV R0,-(SP) ;SAVE EFN MASK MOV R1,-(SP) ;SAVE EFN ADDRESS BR 5$ ; 3$: DRSTS D.RS2 ;ATTEMPT TO SEND TO AN ACP TASK 4$: CLR -(SP) ;INDICATE NO EFN SPECIFIED MOV T.NAM(R5),-(SP) ;SAVE SENDER TASK NAME MOV T.NAM+2(R5),-(SP) ; 5$: MOV (R3),R3 ;PICK UP ADDRESS OF WINDOW DEF BLOCK MOV #8.*2,R1 ;SET SIZE TO ADDRESS CHECK CALL $ACHKP ;ADDRESS CHECK AND MAP WINDOW DEF BLOCK ADD #W.NRID,R3 ;POINT TO REGION ID IN BLOCK CALL $SRATT ;SEARCH FOR SPECIFIED ATTACHMENT DESCRIPTOR CMP (R3)+,-(SP) ;BUMP POINTERS FOR REGION ID (W.NRID) MOV (R3)+,-(SP) ;SAVE OFFSET WORD (W.NOFF) MOV (R3)+,-(SP) ;SAVE LENGTH WORD (W.NLEN) MOV (R3)+,-(SP) ;SAVE STATUS WORD (W.NSTS) BIC #^C17,(SP) ;CLEAR ALL BUT ACCESS BNE 6$ ;IF NE ACCESS SPECIFIED MOVB A.STAT(R5),(SP) ;DEFAULT TO ACCESS OF SENDER TASK 6$: MOVB A.STAT(R5),-(SP) ;PUSH ATTACHMENT DESCRIPTOR ADDRESS COMB (SP) ;COMPUTE ACCESS DENIED MASK BITB (SP)+,(SP) ;CHECK SPECIFIED ACCESS AGAINST SENDER TASK BNE 70$ ;IF NE ACCESS DENIED MOV -2(R3),-(SP) ;SAVE W.NSTS FOR WS.NAT CHECK MOV (R3),R3 ;POINT TO SEND BUFFER BEQ 10$ ;IF EQ THERE IS NONE MOV #8.*2,R1 ;SET SIZE TO ADDRESS CHECK CALL $ACHKP ;ADDRESS CHECK AND MAP SEND BUFFER ADD #8.*2,R3 ;POINT TO END OF SEND BUFFER 10$: CALL $ALPKT ;ALLOCATE A SEND PACKET .IF DF R$$DSP ADD #20.*2,R0 ;POINT PAST DESTINATION FOR TASK NAME MOV $TNAME+2,-(R0) ;STORE SECOND WORD OF MULTI-USER NAME MOV $TNAME,-(R0) ;STORE FIRST WORD CMP -(R0),-(R0) ;POINT TO AREA FOR SEND BUFFER .IFF ADD #16.*2,R0 ;POINT PAST DESTINATION FOR SEND BUFFER .ENDC MOV #8.,R1 ;SET LOOP COUNT FOR COPY MOV R1,R2 ;COPY LOOP COUNT 20$: MOV R3,-(R0) ;WAS A SEND BUFFER SPECIFIED? BEQ 30$ ;IF EQ NO MOV -(R3),(R0) ;ELSE COPY NEXT WORD 30$: DEC R2 ;DONE YET? BGT 20$ ;IF GT NO MOV (SP)+,R3 ;RESTORE POINTER TO SEND BUFFER MOV (SP),R4 ;PICK UP STATUS WORD 40$: MOV (SP)+,-(R0) ;INSERT SAVED WORDS ON STACK DEC R1 ;DONE YET? BGT 40$ ;IF GT NO MOV A.PCB(R5),R2 ;PICK UP PCB ADDRESS FROM ATT DESCRIPTOR BIT #PS.PER,P.STAT(R2) ;PARITY ERROR? BNE 90$ ;IF NE YES MOV (R0),R5 ;PICK UP SAVED RECEIVER TASK ADDRESS MOV $PTCPT,KISAR6 ;REMAP TCB IF IT WAS A PROTOTYPE BIT #WS.NAT,R3 ;SHOULD ATT DESCR BE CREATED ? BEQ 45$ ;YES IF EQ CMP #^R...,T.NAM(R5) ;SEND TO MULTIUSER TASK ? BNE 41$ ;IF NE NO MOV T.RRFL(R5),R3 ;POINT TO FIRST SEND BY REFERENCE PACKET 400$: BEQ 45$ ;END OF LIST, DIDN'T FIND ADB CMP $TNAME,44(R3) ;THIS SREF FOR RIGHT MULTI-USER COPY ? BNE 410$ ;IF NE NO CMP $TNAME+2,46(R3) ;MAYBE BNE 410$ ;DEFINITELY NOT MOV 10(R3),R1 ;POINT TO ADB FOR THIS SREF CMP A.PCB(R1),R2 ;ADB FOR THIS PCB ? BEQ 49$ ;IF EQ YES, WE DON'T NEED TO CREATE ONE 410$: MOV (R3),R3 ;POINT TO NEXT SREF PACKET BR 400$ ;AND GO AROUND AGAIN 41$: MOV T.ATT(R5),R1 ;GET FIRST ATTACHMENT DESCRIPTOR BEQ 45$ ;IF EQ END OF LIST 42$: SUB #A.TCBL,R1 ;POINT TO START OF ATT DESCRIPTOR CMP A.PCB(R1),R2 ;MATCH? BEQ 49$ ;YES IF EQ MOV A.TCBL(R1),R1 ;GET NEXT ATT DESCR ADDRESS BNE 42$ ;IF NE GO AGAIN 45$: MOV R0,-(SP) ;SAVE ADDRESS OF SEND PACKET CALL $CRATT ;ATTACH RECEIVER TASK TO REGION MOV (SP)+,R0 ;RETRIEVE ADDRESS OF PACKET BCS 80$ ;IF CS ALLOCATION FAILURE CMP #120000,R5 ;TARGET TCB IN SEC POOL ? BHI 49$ ;IF HI NO BISB #AS.PRO,A.STAT(R1) ;INDICATE A.TCB POINTS TO SEC POOL MOV $PTCPT,A.TCB(R1) ;INSERT BIAS OF SEC POOL TCB 49$: MOV R1,10(R0) ;SET REGION ID IN PACKET MOV R0,R1 ;COPY POINTER TO PACKET TST (R0)+ ;POINT TO TCB ADDRESS TST (R0)+ ;EFN SPECIFIED? BEQ 50$ ;IF EQ NO MOV (R0)+,-(SP) ;GET EVENT FLAG MASK MOV (R0),R0 ;GET EVENT FLAG MASK ADDRESS BIC #1,R0 ;CLR GRP GLOBAL 2ND WORD INDICATOR BIC (SP)+,(R0) ;CLEAR SPECIFIED EVENT FLAG NOW 50$: MOV R5,R0 ;POINT TO RECEIVE BY REFERENCE LISTHEAD ADD #T.RRFL,R0 ; CALL $QINSF ;INSERT IN RECEIVE QUEUE MOV #AS.RRA,R4 ; GET CODE FOR RECEIVE BY REF AST CALL $DASTT ;DECLARE RECEIVE BY REFERENCE AST CALLR $DRDSE ;DECLARE A SIGNIFICANT EVENT 60$: DRSTS D.RS2 ;ATTEMPT TO SEND TO AN ACP TASK 70$: DRSTS D.RS16 ;PRIVILEGE VIOLATION 80$: CALL $DEPKT ;DEALLOCATE SEND PACKET DRSTS D.RS1 ;ALLOCATION FAILURE 90$: CALL $DEPKT ;DEALLOCATE SEND PACKET DRSTS D.RS6 ;PARITY ERROR .ENDC .END